package Model.Application;

import Model.Application.Exception.CalculateApplicationException;
import Model.Application.Exception.CalculerAnnuiteApplicationException;
import Model.Application.Exception.CalculerNombreAnneeApplicationException;
import Share.Constante.ConstanteIdException;
import Share.Constante.ConstanteIdModeServer;

/**
 *
 * @author Alex
 */
public class ApplicationLocal implements IModel {

    /**
     *  Constructeur
     */
    public ApplicationLocal() {
    }

    /**
     *  Méthode pour lancer le Socket de connexion Server et le protocole Client
     */
    @Override
    public double calculate(int mode, double amount, double rate, Double arg) throws CalculateApplicationException {
        try {
            if (mode == ConstanteIdModeServer.NOMBRE_ANNEE) {
                return calculerNombreAnnee(amount, rate, arg);
            } else if (mode == ConstanteIdModeServer.ANNUITE) {
                return calculerAnnuite(amount, rate, arg);
            } else {
                throw new CalculateApplicationException(ConstanteIdException.CALCULATE_APPLICATION_EXCEPTION);
            }
        } catch (CalculerNombreAnneeApplicationException ex) {
            throw new CalculateApplicationException(ex.getId());
        } catch (CalculerAnnuiteApplicationException exx) {
            throw new CalculateApplicationException(exx.getId());
        } catch (ClassCastException ccex) {
            throw new CalculateApplicationException(ConstanteIdException.CALCULATE_APPLICATION_EXCEPTION);
        }
    }

    /**
     *  Méthode de calcul d'annuité
     *  @param Double montant
     *  @param Double tauxInteret
     *  @param Integer nombreAnnee
     *  @return Double : l'annuité 
     *  @Throws CalculerAnnuiteApplicationException
     */
    private Double calculerAnnuite(Double montant, Double tauxInteret, Double nombreAnnee) throws CalculerAnnuiteApplicationException {

        if (montant == null || tauxInteret == null || nombreAnnee == null) {
            throw new CalculerAnnuiteApplicationException(ConstanteIdException.CALCULER_ANNUITE_APPLICATION_EXCEPTION);
        }

        return (montant * (1 + (tauxInteret / 100))) / nombreAnnee;

    }

    /**
     *  Méthode de calcul du nombre d'année
     *  @param Double montant
     *  @param Double tauxInteret
     *  @param Double annuite 
     *  @return Double : le nombre d'année
     *  @Throws CalculerNombreAnneeApplicationException
     */
    private Double calculerNombreAnnee(Double montant, Double tauxInteret, Double annuite) throws CalculerNombreAnneeApplicationException {

        if (montant == null || tauxInteret == null || annuite == null) {
            throw new CalculerNombreAnneeApplicationException(ConstanteIdException.CALCULER_NOMBRE_ANNEE_APPLICATION_EXCEPTION);
        }
        return (montant * (1 + (tauxInteret / 100))) / annuite;
    }
}
